// 处理对象复杂元素
const noreapeat_array_byId = (arr1 = [], arr2 = [], uniqueKey = 'id') => {
  // 根据字段返回二者的去重复数据
  const merged = [...arr1, ...arr2];
  const uniqueMap = new Map();
  merged.forEach(item => {
    if (item && item[uniqueKey] !== undefined) {
      uniqueMap.set(item[uniqueKey], item);
    }
  });
  
  return Array.from(uniqueMap.values());
};
// 获取第二个数组的非第一个数组的重复项
const getUniqueItemsFromSecondArray_byId = (arr1 = [], arr2 = [], uniqueKey = 'id') => {
  // 创建第一个数组的唯一键集合
    const arr1Keys = new Set();
    arr1.forEach(item => {
      if (item && item[uniqueKey] !== undefined) {
        arr1Keys.add(item[uniqueKey]);
      }
    });
  // 筛选第二个数组中不在第一个数组中的项
    return arr2.filter(item => {
      return item && item[uniqueKey] !== undefined && !arr1Keys.has(item[uniqueKey]);
    });

};

const noreapeat_array = function (arr1 = [], arr2 = []) {
    // es6语法和py类似默认值
  function isEqual(obj1, obj2) {
    // 相同引用或基本类型值相等
    if (obj1 === obj2) return true;
    
    // 处理null和undefined
    if (obj1 == null || obj2 == null) return false;
    
    // 处理非对象类型
    if (typeof obj1 !== 'object' || typeof obj2 !== 'object') {
      return obj1 === obj2;
    }
    
    // 获取自身可枚举属性（不包含原型链）
    const keys1 = Object.keys(obj1);
    const keys2 = Object.keys(obj2);
    
    // 属性数量不同
    if (keys1.length !== keys2.length) return false;
    
    // 深度比较每个属性
    for (const key of keys1) {
      if (!keys2.includes(key) || !isEqual(obj1[key], obj2[key])) {
        return false;
      }
    }
    
    return true;
  }

  // 边界情况处理
  if (!Array.isArray(arr1) || !Array.isArray(arr2)) {
    throw new TypeError('输入参数必须是数组');
  }

  // 合并并去重
  return [...arr1, ...arr2].reduce((acc, current) => {
    const isDuplicate = acc.some(item => isEqual(item, current));
    return isDuplicate ? acc : [...acc, current];
  }, []);
}

export {noreapeat_array_byId, noreapeat_array,getUniqueItemsFromSecondArray_byId}